package com.hcss.common.util;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.Stroke;
import java.awt.image.BufferedImage;
import java.util.Hashtable;
import java.util.Map;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.oned.Code128Writer;
import com.hcss.common.util.EmptyUtil;

/**
 * 条形码生成工具类
 * 
 * 条形码底部如果添加文件 ****不能为中文,最主要的是CODE_128 不支持中文
 */
public class BarCodeUtils {
	/** 条形码宽度 */
	public static final int BAR_WIDTH = 150;

	/** 条形码高度 */
	public static final int BAR_HEIGHT = 50;

	/** 加文字 条形码 */
	public static final int WORDHEIGHT = 75;

	/**
	 * 生成 图片缓冲
	 * 
	 * @param contents
	 * @return 返回BufferedImage
	 */
	public static BufferedImage getBarCode(String contents) {
		Map<EncodeHintType, Object> hints = new Hashtable<>();
		hints.put(EncodeHintType.CHARACTER_SET, "utf-8");

		Code128Writer writer = new Code128Writer();
		// 编码内容, 编码类型, 宽度, 高度, 设置参数
		BitMatrix bitMatrix = null;
		try {
			bitMatrix = writer.encode(contents, BarcodeFormat.CODE_128, BAR_WIDTH, BAR_HEIGHT, hints);
			// DEFAULT_CONFIG 黑白
			return MatrixToImageWriter.toBufferedImage(bitMatrix);
		} catch (WriterException e) {
			e.printStackTrace();
		}
		return null;

	}

	/**
	 * 把带logo的二维码下面加上文字,当words为空时直接返回image
	 * 
	 * @param image
	 *            条形码图片
	 * @param font
	 * @param words
	 *            文字
	 * @return 返回BufferedImage
	 */
	public static BufferedImage insertWords(BufferedImage image, Font font, String words) {
		// 新的图片，把带logo的二维码下面加上文字
		if (!EmptyUtil.isHaveEmpty(words)) {
			 BufferedImage outImage = new BufferedImage(image.getWidth()+10, image.getHeight()+50,
			 BufferedImage.TYPE_INT_RGB);
			 Graphics2D g2d = outImage.createGraphics();
			 // 抗锯齿
			 setGraphics2D(g2d);
			 // 设置白色
			 setColorWhite(g2d,image.getWidth()+10,image.getHeight()+50);
			 // 画条形码到新的面板
			 g2d.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null);
			 // 画文字到新的面板
			 Color color = new Color(0, 0, 0);
			 g2d.setColor(color);
			  //字体、字型、字号
			 g2d.setFont(font);
			 // 文字长度
			 int strWidth = g2d.getFontMetrics().stringWidth(words);
			 //总长度减去文字长度的一半 （居中显示）
			 int wordStartX = (image.getWidth()+10 - strWidth) / 2;
			 int wordStartY = image.getHeight() + 20;
			 // 画文字
			 g2d.drawString(words, wordStartX, wordStartY);
			 g2d.dispose();
			 outImage.flush();
			 return outImage;
		} else {
			return image;
		}

	}

	 /**
	 * 设置 Graphics2D 属性 （抗锯齿）
	 *
	 * @param g2d
	 * Graphics2D提供对几何形状、坐标转换、颜色管理和文本布局更为复杂的控制
	 */
	 private static void setGraphics2D(Graphics2D g2d) {
	 g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
	 RenderingHints.VALUE_ANTIALIAS_ON);
	 g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL,
	 RenderingHints.VALUE_STROKE_DEFAULT);
	 Stroke s = new BasicStroke(1, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER);
	 g2d.setStroke(s);
	 }
	
	 /**
	 * 设置背景为白色
	 *
	 * @param g2d
	 * Graphics2D提供对几何形状、坐标转换、颜色管理和文本布局更为复杂的控制
	 * @param j 
	 * @param i 
	 */
	 private static void setColorWhite(Graphics2D g2d, int i, int j) {
	 g2d.setColor(Color.WHITE);
	 // 填充整个屏幕
	 g2d.fillRect(0, 0, i, j);
	 // 设置笔刷
	 g2d.setColor(Color.BLACK);
	 }
}
